home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 June: Reference Library / Dev.CD Jun 99 RL Disk 1.toast / Technical Documentation / Macintosh Technotes and Q&As / technotes / tn / 1021_Offscreen_Bitmaps.cw < prev    next >
Encoding:
Text File  |  1997-12-10  |  37.4 KB  |  480 lines  |  [TEXT/R*ch]

  1. —BOBO≥güdHZHZHZ‹
  2. ≥hÄÿÿH≥k´ªB<#~àÿÿ≥gÿ-Z
  3.     ÿÿÿFrederique Courard HaurixHHÚ(ÿáÿâùFG(üHHØ(d'`Δÿÿ≥≠@        ∫#/À¢~@≥§ ≥eT≥hΔ~¢@ÿfl≥∫P≤ê ≥hÔ4°ÿÿÿÿÿÿÿÿ9∫Æ7DSETD    GJ0[
  4. /N≥h°≥e(≥h•≥¨p°O≥h›A;°O≥dp*O g°O≥f¨)F°O≥œÜ-OΩ°O≥fÌ,F °O≥¨P+@#≠°O≥f°(I)I°O≥g,J0°O™˘ Ex H#Ì#Í#:#Å#U)9):);,V#+2N#3:    ∏:∞>©D:>>4Dï:bD≥:>7D:#•>#™>#≠>#–D$:%>%@D%ä:&_D&™:-v`-w`-D-÷D0>0/l0Zr0[r¨àààwG•H
  5. ™≈    
  6. àu£
  7. 
  8. ∞€
  9. ≥t"~{
  10. ≥â"~›
  11. ≥u"~}
  12. ≥U
  13. à≠Y
  14. ∑;ÓxU∫V
  15. ™*à‘+àyN
  16. ™±"~’
  17. ™3"z∞à{©
  18. ⁄"zà{3 Œ4
  19. ⁄Î"v◊
  20. ڕ"zb
  21. ⁄≥"zà{6 ‰7
  22. ⁄˚"v¢
  23. ⁄"z#•à{#¬ ˜#–
  24. ⁄$"z%à{%? ˚%@
  25. ⁄%Ã"v%Ì
  26. ⁄%ä"z&_
  27. ⁄&™"z-vÓ|-~˝-
  28. ⁄-€"v-ª
  29. ˇ-Ç"v-Ï
  30. ˇ-é"v-ï
  31. ˇ.Œ"v.˚
  32. ˇ/"v/'
  33. ˇ/U"v/]
  34. ˇ/d"v/j
  35. ˇ/È"v/‹
  36. ˇ0à{0.  0/¡01
  37. Ω0Z
  38. €≠§˝§ª≥ePQú≥i Kû≥eF›™˘6ó≥kd)ò≥f¬ö≥f@‡≥e#î≥h€&ü≤≥e8*º1≥e|,ëq≥hä§ 
  39. T E C H N O T E:
  40. Creating Off-Screen Bitmaps
  41. When Speed is Critical
  42. By Jim Friedlander & Ginger Jernigan
  43. Revised by Mike Marinkovich
  44. marink@applelink.apple.com
  45. Apple Developer Technical Support (DTS)
  46.  
  47. This Technote provides an example of creating an off-screen bitmap by hand, drawing to it, and then copying from it to the screen. Apple encourages the use of GWorlds for your off-screen needs. In some cases, however, creating your own off-screens can be beneficial. The resulting off-screen bitmaps can be used like a 1-bit GWorld, but with improved performance. 
  48. This technique is useful for the creation of regions when OpenRgn is not an option. For example, in making a region from a line, draw the line in an offscreen and call BitMapToRegion to convert the off-screen's bitmap to a region. These off-screen bitmaps can be also be substituted for pixmaps in routines such as CopyMask, where the mask is black and white, and sªpeed is of great importance. 
  49. This Technote is written primarily for those involved in speed-critical projects, such as game developers and graphics applications developers.
  50. Note: This technique for creating off-screen bitmaps is intended for black and white uses only. If your needs include only color ports, you should review the Technote ÒTechniques for Creating Off-Screen Graphics Environments.Ó 
  51.  
  52.  
  53. Drawing Off-Screen Bitmaps
  54. The following is an example of creating and drawing to an off-screen bitmap, then copying from it to an on-screen window. The example is supplied in both a C and Pascal versions, and will work with all compilers.
  55. Creating an Off-Screen Bitmap in C
  56. LetÕs look at a general purpose function to create an off-screen bitmap. This function creates the GrafPort on the heap. You can also create it on the stack and pass the uninitialized structure to a function similar to this one.
  57. Boolean CreateOffscreenBitMap(úGrafPtr *newOffscreen, Rect *inBounds)
  58. {
  59.     GrafPtr savePort;
  60.     GrafPtr newPort;
  61.  
  62.     GetPort(&savePort);    /* need this to restore thePort after
  63.                                                             OpenPort */
  64.  
  65.     newPort = (GrafPtr) NewPtr(sizeof(GrafPort));    /* allocate the
  66.                                                             grafPort */
  67.     if (MemError() != noErr)
  68.         return false;                             /* failed to allocate the off-screen
  69.                                                                 port */
  70.     /*
  71.     the call to OpenPort does the following . . . 
  72.         allocates space for visRgn (set to screenBits.bounds) and
  73.         clipRgn (set wide open)
  74.         sets portBits to screenBits
  75.         sets portRect to screenBits.bounds
  76.         (See Inside Mac: Imaging with QuickDraw,
  77.         pages 2-38 to 2-39)
  78.         side effect: does a SetPort(&offScreen)
  79.     */
  80.     OpenPort(newPort);
  81.     /* make bitmap the size of the bounds that caller supplied */
  82.     newPort->portRect = *inBounds;
  83.     newPort->portBits.bounds = *inBounds;
  84.     RectRgn(newPort->clipRgn, inBounds);                                        /* avoid wide-open clipRgn,
  85.                                                         be safe  */
  86.     RectRgn(newPort->visRgn, inBounds);                                        /* in case newBounds is >
  87.             û                                            screen bounds */
  88.  
  89.     /* rowBytes is size of row, it must be rounded up to an even number
  90.                                                             of bytes */
  91.     newPort->portBits.rowBytes = ((inBounds->right - inBounds->left +
  92.                                                         15) >> 4) << 1;
  93.  
  94.     /* number of bytes in BitMap is rowBytes * number of rows */
  95.     /* see notes at end of Technote about using _NewHandle rather
  96.                                                         than _NewPtr*/
  97.     newPort->portBits.baseAddr = 
  98.             NewPtr(newPort->portBits.rowBytes * (long) (inBounds->bottom
  99.                                                     - inBounds- >top));
  100.     if (newPort->portBits.baseAddr == nil) { /* check to see if we had enough room for
  101.                                                             the bits */
  102.         SetPort(savePort);
  103.         ClosePort(newPort);      /* dump the visRgn and clipRgn */
  104.         DisposPtr((Ptr)newPort); /* dump the GrafPort */
  105.         return false;            /* tell caller we failed */
  106.         }
  107.     /* since the bits are just memory, let's clear them before we start*/
  108.     EraseRect(inBounds);     /* OpenPort did a SetPort(newPort) so we
  109.                                                                 are ok */
  110.     *newOffscreen = newPort;
  111.     SetPort(savePort);
  112.     ›return true;               /* tell caller we succeeded! */
  113. }
  114. Eliminating an Off-Screen Bitmap in C
  115. To eliminate an off-screen bitmap created by the previous function, use this function:
  116. void DestroyOffscreenBitMap(GrafPtr oldOffscreen)
  117. {
  118.     ClosePort(oldOffscreen);                                            /* dump the visRgn and
  119.                                                             clipRgn */
  120.     DisposPtr(oldOffscreen->portBits.baseAddr);                                            /* dump the bits */
  121.     DisposPtr((Ptr)oldOffscreen);                                            /* dump the port */
  122. }
  123.  
  124. Using an Off-Screen Bitmap in C
  125. Now that you know how to create and destroy an off-screen bitmap, letÕs go through the motions of using one. First, letÕs define a few things to make the NewWindow call a little clearer.
  126. #define kIsVisible true
  127. #define kNoGoAway false
  128. #define kNoWindowStorage 0L
  129. #define kFrontWindow ((WindowPtr) -1L)
  130. HereÕs the body of the test code:
  131. main()
  132. {
  133.     char* myString = "\pThe EYE";  /* string to display */
  134.  
  135.     GrafPtr   offscreen;           /* our off-screen bitmap */
  136.     Rect      ovalRect;            /* used for example ódrawing */
  137.     Rect      myWBounds;           /* for creating window */
  138.     Rect      OSRect;              /* portRect and bounds for off-screen
  139.                                                                 bitmap*/
  140.     WindowPtr myWindow;
  141.  
  142.     InitToolbox();                 /* exercise for the reader */
  143.     myWBounds = qd.screenBits.bounds;  /* size of main screen */
  144.     InsetRect(&myWBounds, 50,50);  /* make it fit better */
  145.     myWindow = NewWindow(kNoWindowStorage, &myWBounds, "\pTest Window",
  146.                             kIsVisible,noGrowDocProc, kFrontWindow,
  147.                             kNoGoAway, 0);
  148.     if (!CreateOffscreenBitMap(&offscreen, &myWindow->portRect)) {
  149.         SysBeep(1);
  150.         ExitToShell();
  151.         }
  152.     /* Example drawing to our off-screen bitmap*/
  153.     SetPort(offscreen);
  154.     OSRect = offscreen->portRect;  /* offscreen bitmap's local
  155.                                                 coordinate rect */
  156.     ovalRect = OSRect;
  157.     FillOval(&ovalRect, qd.black);
  158.     InsetRect(&ovalRect, 1, 20);
  159.     FillOval(&ovalRect, qd.white);
  160.     InsetRect(&ovalRect, 40, 1);
  161.     FillOval(&ovalRect, qd.black);
  162.     MoveTo((ovalRect.left + ovalRect.right - StringWidth(myString)) >> 1,
  163.     ò                        (ovalRect.top + ovalRect.bottom - 12) >> 1);
  164.     TextMode(srcXor);
  165.     DrawString(myString);
  166.  
  167.     /* copy from the off-screen bitmap to the on-screen window.  Note
  168.     that in this case the source and destination rects are the same size
  169.     and both cover the entire area.  These rects are allowed to be
  170.     portions of the source and/or destination and do not have to be the
  171.     same size.  If they are not the same size then _CopyBits scales the 
  172.     image accordingly.
  173.     */
  174.     SetPort(myWindow);
  175.     CopyBits(&offscreen->portBits, &(*myWindow).portBits,
  176.             &offscreen->portRect, &(*myWindow).portRect, srcCopy, 0L);
  177.  
  178.     DestroyOffscreenBitMap(offscreen);    /* dump the off-screen bitmap*/
  179.     while (!Button());     /* give user a chance to see our work of art*/
  180. }  
  181. Creating an Off-Screen Bitmap in Pascal
  182. LetÕs look at a general purpose function to create an off-screen bitmap. This function creates the GrafPort on the heap. You can also create it on the stack and pass the uninitialized structure to a function similar to this one.ö
  183. FUNCTION CreateOffscreenBitMap(VAR newOffscreen:GrafPtr; inBounds:Rect)
  184.                 : BOOLEAN;
  185.  
  186.     savePort  : GrafPtr;
  187.     newPort   : GrafPtr;
  188.  
  189.     GetPort(savePort);                    {need this to restore thePort after OpenPort
  190.                                                         changes it}
  191.  
  192.     newPort := GrafPtr(NewPtr(sizeof(GrafPort)));                                                {allocate the
  193.                         GrafPort}
  194.     IF MemError <> noErr THEN BEGIN
  195.         CreateOffscreenBitMap := false;                                    {failed to allocate it}
  196.         EXIT(CreateOffscreenBitMap);
  197.     END;
  198.     {
  199.     the OpenPort call does the following . . . 
  200.     allocates space for visRgn (set to screenBits.bounds) and clipRgn
  201.     (set wide open)
  202.     sets portBits to screenBits
  203.     sets portRect to screenBits.bounds
  204.     (See Inside Mac: Imaging with QuickDraw, pages 2-38 to 2-39)
  205.     side effect: does a SetPort(offScreen)
  206.     }
  207.     OpenPort(newPort);
  208.     {make bitmap exactly the size of the bounds that caller supplied}
  209.     WITH newPort^ DO BEGIN {portRect, clipRgn, and visRgn are in newPort}
  210.         portRect := inBounds;
  211.         RectRgn(clipRgn, inBounds);                            {avoid wide-open clipRgn, to be safe}
  212.         ‡RectRgn(visRgn, inBounds);                            {in case inBounds is > screen bounds}
  213.     END;
  214.  
  215.     WITH newPort^.portBits DO BEGIN                                    {baseAddr, rowBytes and bounds
  216.                                                 are in newPort}
  217.         bounds := inBounds;
  218.         {rowBytes is size of row  It must be rounded up to even number
  219.                                                             of bytes}
  220.         rowBytes := ((inBounds.right - inBounds.left + 15) DIV 16) * 2;
  221.  
  222.         {number of bytes in BitMap is rowBytes * number of rows}
  223.         {see note at end of Technical Note about using _NewHandle rather
  224.                                                             than _NewPtr}
  225.         baseAddr := NewPtr(rowBytes * LONGINT(inBounds.bottom -
  226.                                                         inBounds.top));
  227.     END;
  228.     IF baseAddr == nilTHEN BEGIN                                    {see if we had enough room for
  229.                                                                 the bits}
  230.         SetPort(savePort);
  231.         ClosePort(newPort);              {dump the visRgn and clipRgn }
  232.         DisposPtr(Ptr(newPort));         {dump the GrafPort}
  233.         CreateOffscreenBitMap := false;
  234.     END
  235.     ELSE BEGIN
  236.         {since the bits are just memory, let's erase them before we
  237.                                                                 start }
  238.         EraseRect(inBounds);            {OpenPoîrt did a SetPort(newPort)}
  239.         newOffscreen := newPort;
  240.         SetPort(savePort);
  241.         CreateOffscreenBitMap := true;
  242.     END;
  243.  
  244.  
  245. Eliminating an Off-Screen Bitmap in Pascal
  246. Here is the procedure to get rid of an off-screen bitmap created by the previous function:
  247. PROCEDURE DestroyOffscreenBitMap(oldOffscreen : GrafPtr);
  248.     ClosePort(oldOffscreen);                                                {dump the visRgn
  249.                                                         and clipRgn }
  250.     DisposPtr(oldOffscreen^.portBits.baseAddr);                                                {dump the bits }
  251.     DisposPtr(Ptr(oldOffscreen));                                                {dump the port };
  252. Using an Off-Screen Bitmap: MPW Pascal
  253. Now that you know how to create and destroy an off-screen bitmap, letÕs test one out. First, letÕs define a few things to make the NewWindow call a little clearer.
  254. CONST
  255.     kIsVisible   = true;
  256.     kNoGoAway    = false;
  257.     kMakeFrontWindow = -1;
  258.     myString     = 'The EYE';  {string to display}
  259. HereÕs the body of the test code:
  260. VAR
  261.     offscreen : GrafPtr;    {our off-screen bitmap}
  262.     ovalRect  : Rect;       {used for example drawing}
  263.     myWBounds : Rect;≤       {for creating window}
  264.     OSRect    : Rect;       {portRect and bounds for off-screen bitmap}
  265.     myWindow  : WindowPtr;
  266.  
  267.     InitToolbox;                       {exercise left to the reader}
  268.  
  269.     myWBounds := screenBits.bounds;    {size of main screen }
  270.     InsetRect(myWBounds, 50,50);       {make it fit better }
  271.     myWindow := NewWindow(NIL, myWBounds, 'Test Window', kIsVisible,
  272.             noGrowDocProc, WindowPtr(kMakeFrontWindow), kNoGoAway, 0);
  273.  
  274.     IF NOT CreateOffscreenBitMap(offscreen,myWindow^.portRect) THEN BEGIN 
  275.         SysBeep(1);
  276.         ExitToShell;
  277.     END;
  278.  
  279.     {Example drawing to our off-screen bitmap }
  280.     SetPort(offscreen);
  281.     OSRect := offscreen^.portRect;    {offscreen bitmap's local
  282.                                             coordinate rect }
  283.     ovalRect := OSRect;
  284.     FillOval(ovalRect, black);
  285.     InsetRect(ovalRect, 1, 20);
  286.     FillOval(ovalRect, white);
  287.     InsetRect(ovalRect, 40, 1);
  288.     FillOval(ovalRect, black);
  289.     WITH ovalRect DO
  290.         MoveTo((left+right-StringWidth(myString)) DIV 2, (top+bottom-12)
  291.                                         1                    DIV 2);
  292.     TextMode(srcXor);
  293.     DrawString(myString);
  294.  
  295.     {copy from the off-screen bitmap to the on-screen window.  Note
  296.     that in this case the source and destination rects are the same size
  297.     and both cover the entire area.  These rects are allowed to be
  298.     portions of the source and/or destination and do not have to be the
  299.     same size.  If they are not the same size then _CopyBits scales the
  300.     image accordingly
  301.     }
  302.     SetPort(myWindow);
  303.     CopyBits(offscreen^.portBits, myWindow^.portBits,
  304.             offscreen^.portRect, myWindow^.portRect, srcCopy, NIL);
  305.  
  306.     DestroyOffscreqenBitMap(offscreen);                                    {remove the evidence}
  307.  
  308.     WHILE NOT Button DO;                                    {give user a chance to see the
  309.                                                                 results}.
  310.  
  311. Summary
  312. In the example code, the bits of the BitMap structure pointed to by the baseAddr field are allocated by a NewPtr call. 
  313. Keeping a large off-screen around for any length of time may lead to heap fragmentation. One alternative that lessens this problem is to get the bits via NewHandle, so that the Memory Manager can move them when necessary. To implement this approach, you need to keep the handle separate from the GrafPort (for example, in a structure that combines a GrafPort and a Handle). When using the off-screen bitmap, lock the handle and put the dereferenced handle into the baseAddr field. You can then unlock the handle when not using the off-screen bitmap.
  314. Further Reference
  315. ¥    Inside Macintosh: Imaging with QuickDraw
  316.  
  317. ZÿÿN°DSET≠ÿÿ.H=Xÿÿÿÿÿÿ≥f°√b¯È°ÿÿ6ÿÿ*b¯DSETΔÿÿ.HHHÿÿÿÿÿÿ≥ex¯O°ÿÿ√◊°ÿÿ_°ÿÿ˘    ç°ÿÿ
  318.   o°ÿÿ ¨÷°ÿÿ0°ÿÿ¸°ÿÿ@∂°ÿÿP√°ÿÿذÿÿ`˘°ÿÿ    è
  319.  °ÿÿ p ¨°ÿÿø0°ÿÿ•¸°ÿÿ@°ÿÿΔȰ    ÿÿ6ÿÿ*b¯DSET≠ÿÿ.Hÿÿÿÿÿÿ≥eü?•I8°ÿÿ°
  320. ÿÿ*?•I°8     °8
  321.  °8  °8  °8
  322.  °8 °8 °8 °8‘DSETT≥≥@∫≥e ≥k˛≥fÔ˝°8≥fP7(}}}∑}∫} "    à }[ˇP[¥ΔWWl≤[¡‰
  323. Ω≥e¸Ω
  324.  
  325. Technote 1021        ///          Release 1.0       © 1996   Apple Computer, Inc.      ///              ///          Page  of  9
  326.  
  327. FNTMCUTSDSUM1Frederique Courard HauriHDNISTYL4¶ÿÿ@STYL≥ed≥gØ≥g€≥ep≥i≥hô≥f,≥fh€Âÿÿ“
  328. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
  329. ÿÿÿÿ
  330. ÿÿÿÿ
  331. ÿÿÿÿ
  332. ÿÿÿÿÿÿÿÿÿÿ    ÿÿÿÿ        ÿÿÿÿÿÿ
  333.     ÿÿÿÿÿÿ     ÿÿ%ÿÿÿÿ #    ÿÿ&ÿÿÿÿ
  334. )    ÿÿ'ÿÿÿÿ,    ÿÿ(ÿÿÿÿ2    ÿÿ)ÿÿÿÿ:    ÿÿ*ÿÿ>    ÿÿ)ÿÿ 'D    ÿÿ&ÿÿ`    ÿÿ(ÿÿÿÿl    ÿÿ+ÿÿr    ÿÿ&ÿÿÿÿ•ÿÿ 
  335. ÿÿÿÿ™ÿÿ#
  336. ÿÿÿÿ∞ÿÿ#9ÿÿ≥ÿÿ#
  337. ÿÿÿÿ∑ÿÿ)
  338. ,ÿÿÿÿ∫ÿÿ,ÿÿ ⁄ÿÿD
  339. ÿÿÿÿŒÿÿ>Dÿÿÿÿ‰ÿÿ>Gÿÿÿÿ˜ÿÿ>Jÿÿÿÿ ˚ÿÿ>Mÿÿ!˝ÿÿ`ÿÿ"ˇÿÿD
  340. ÿÿÿÿ# ÿÿ>Pÿÿÿÿ$¡ÿÿl
  341. #ÿÿ"%€ÿÿr
  342. ÿÿÿÿ    &
  343. ÿÿÿÿ' ÿÿÿÿ(
  344. ÿÿ    ÿÿ)ÿÿ
  345. ÿÿ*ÿÿ ÿÿ+ÿÿÿÿ ÿÿ,ÿÿÿÿ
  346. ÿÿ-ÿÿÿÿÿÿ%.‹ÿÿÿÿÿÿ/0ÿÿÿÿ00ÿÿÿÿ10ÿÿÿÿ20ÿÿÿÿ30ÿÿÿÿ40    ÿÿÿÿ50
  347. ÿÿÿÿ60 ÿÿÿÿ70 ÿÿÿÿ8 0
  348. ÿÿÿÿ9!0ÿÿÿÿ:"0ÿÿÿÿ;$0ÿÿÿÿ%<%‹ÿÿÿÿÿÿ=&0%%ÿÿ0>'0%%ÿÿ1?(0%%ÿÿÿÿ@*0%'ÿÿ3A+0%'ÿÿ4B-0%'    ÿÿ5C.0%'
  349. ÿÿ6D/0%' ÿÿ7E00%' ÿÿÿÿF10%&ÿÿÿÿG30%&ÿÿÿÿH40%(ÿÿ;I50%(ÿÿÿÿ%J6‹ÿÿÿÿÿÿK7066 ÿÿÿÿL8066!ÿÿÿÿM9066!ÿÿÿÿN;068"ÿÿÿÿO<068#ÿÿÿÿP=068#    ÿÿÿÿQ?068#
  350. ÿÿÿÿR@068# ÿÿÿÿSA068# ÿÿÿÿTB067$ÿÿÿÿUC067$ÿÿÿÿVE069"ÿÿÿÿWF069#ÿÿÿÿ%XG‹ÿÿÿÿÿÿYH0GG%ÿÿÿÿZI0GGÿÿÿÿ[J0GGÿÿÿÿ\K0GI&    ÿÿÿÿ]L0GIÿÿÿÿ^M0GI     ÿÿÿÿ_N0GI!    ÿÿÿÿ`O0GI"    ÿÿÿÿaP0GI#    ÿÿÿÿbQ0GH'$
  351. ÿÿÿÿcR0GH'%
  352. ÿÿÿÿdS0GJ&    ÿÿÿÿeT0GJ'ÿÿÿÿ%fU‹ÿÿÿÿ(ÿÿgV0UU()ÿÿÿÿhW0UU*ÿÿÿÿiX0UU+ ÿÿÿÿjY0UW,ÿÿÿÿkZ0UW-ÿÿÿÿl[0UW.ÿÿÿÿm\0UW/ÿÿÿÿn]0UW0ÿÿÿÿo^0UW1ÿÿÿÿp_0UV)6
  353. ÿÿÿÿqa0UV)7
  354. ÿÿÿÿrb0UX4
  355. ÿÿÿÿsc0UX5
  356. ÿÿÿÿtd‹ÿÿÿÿ(ÿÿue0dd) ÿÿhvf0dd*ÿÿÿÿwg0dd2ÿÿÿÿxh0df,ÿÿÿÿyi0df3ÿÿÿÿzj0df8ÿÿÿÿ{k0df9ÿÿÿÿ|m0df:ÿÿÿÿ}n0de*6
  357. ÿÿÿÿ~o0dg<ÿÿÿÿp‹ÿÿÿÿ;ÿÿ•q0pp+=ÿÿÿÿ™s0pp>ÿÿÿÿ≠t0ps ÿÿÿÿ∞¥0ps!ÿÿÿÿ≥œ0ps"ÿÿÿÿ∑§0ps#ÿÿÿÿ∫¨0pq,AÿÿÿÿΩ©0pq,Bÿÿÿÿ√ªØÿÿÿÿ    ÿÿ≈«8ªª ÿÿÿÿ…¬8ªª ÿÿÿÿ—–8ªªÿÿÿÿ‘®8ªªÿÿÿÿŸ¯8ªªÿÿÿÿ⁄°8ªªÿÿÿÿ∂±8ªªÿÿÿÿΔ”8ªªÿÿÿÿŒ“8ªªÿÿÿÿ‚´8ªªÿÿÿÿ„µ8ªªÿÿÿÿ‰¶8ªªÿÿÿÿ·Øÿÿÿÿ-ÿÿˆ¸8··.ÿÿÿÿ˜’8··4 ÿÿÿÿ˘º8··6"ÿÿÿÿ˙»8··7$ÿÿÿÿ˚π8··7-ÿÿÿÿ˝∏8··7.ÿÿÿÿ˛≤8··7/ÿÿÿÿˇ¿8··70ÿÿÿÿıÀ8··71ÿÿÿÿƒÁ8··72ÿÿÿÿ  ÂØÿÿÿÿ3ÿÿ¡Ã8ÂÂ4ÿÿÿÿ¢Ä8ÂÂ5ÿÿÿÿ£Å8ÂÂ6ÿÿÿÿ€Æ8ÂÂ7ÿÿÿÿ¥Ç8ÂÂ8ÿÿÿÿœÿÿ /ÿÿÿÿ§wÿÿ0
  358. ÿÿÿÿ¨uÿÿ#    ÿÿÿÿ©x
  359. ,2ÿÿÿÿªy
  360. 23ÿÿÿÿ«z :5ÿÿª¬{
  361. >3ÿÿ©–|
  362. `2ÿÿÿÿ®}    ÿÿ8ÿÿÿÿ¯ÿÿ}:ÿÿ«°~ #5ÿÿÿÿ±≠ÿÿ);,ÿÿ° ”v D5ÿÿÿÿ“Ωÿÿl#ÿÿÿÿ´ÿÿ 
  363. ÿÿ¬µ‘
  364. #3ÿÿÄıÿÿHASH‘
  365. $Ú àù(ô◊‘fôؑtÑÛÔ<ÑÛÔJà"ÔÎ,á´fiãã%8◊ãµÕáXêä&ëå*&
  366.  µ&
  367.     ø–(&”Ω œ®,%¶ "¨¶,"ï2
  368. öb÷A§÷A!´, _b ,¡Q¢v£˝€À¥,≈Q…v—˝‘€.!ÀŸå⁄. 
  369. ∂/ΔTŒy‚ı„É,8ˆQI˜v4˘˝5˙À5˚å5˝    
  370. 5˛    /5ˇ    T5ı    y5ƒ ©Ÿ$ ©´“
  371. ˆ⁄
  372. ®,P
  373. ¯ S±',N
  374. >ABCDEI0:ObPcC8U9øF G    0P    1Q    2R    3SC}JpKq    (L
  375. GH    5@y·Vy˝TÙ?UÙ    HWù2ù?ùBNù    $Mù    3O‡JY‡>/‡ Egÿ>uKï=™-^._/`0aFd`\/l0m1n2o0sJr&].e
  376. "Z
  377. #[
  378. $v
  379. %w≥∑≠∞*∫…”ΩûH~‡/k‡9{‡:|‡1x‡7y‡8z‡Djfl0•'i˜¢◊&
  380. Ú&
  381. †&
  382. à&
  383.  ã&
  384. #/& A& ®A
  385. 7¯L: Qf¸egh“çm-h’ÑÚj–◊alq”º'r§él+r”◊a)t“◊Å z«áoz¶ÕÄ.}Bod}©ÓÖ√jQ1
  386. CHAR≥f0ÿÿÿÿ ÿÿ ÿÿÿú    ÿÿÿfl ÿÿ ÿÿÿû
  387. ÿÿ•ÿÿÿéÿÿ"ÿ† ÿÿÿ÷    
  388. àÿÿÿÿÿÿ ÿÿàÿÿÿÿÿÿÿÿ
  389. ÿÿÿÿÿÿ&ÿÿ
  390. ÿÿ ÿóàÿÿÿú"ÿÿ
  391. ÿòÓ'ÿØ
  392. ÿÿÿ÷ àÿÿÿÿ
  393. ÿÿ"
  394. (
  395. '
  396. ÿÿ%
  397. ÿÿ
  398. ÿÿ     
  399.     ÿÿ
  400.     ÿÿ
  401.     ÿÿ.    ÿÿ
  402.     ÿÿ
  403. !
  404. 
  405.      /    ÿÿ*
  406. 2
  407. %/
  408. ÿÿ        (        
  409. ÿÿ+ÿÿ&    ÿÿ&ÿÿ ÿ÷àÿÿ ÿ÷à<ÿÿÿÿ ÿ÷
  410. àÿÿÓÿÿàÿÿ  ÿÿ"ÿÿ&
  411. -&    ÿÿ ÿÿÿÿ
  412. 
  413. ÿÿÿÿ"    àÿÿÿç
  414. à=ÿÿÿÿÿÿ >ÿÿÿÿÿÿ
  415. ?ÿÿÿÿÿÿ@ÿÿÿÿÿÿ Aÿÿÿÿÿÿ Bÿÿÿÿÿÿ Cÿÿÿÿÿÿ Eÿÿÿÿÿÿ ÿÿÿÿ Fÿÿÿÿÿÿ Hÿÿÿÿÿÿ ÿÿÿÿ Iÿÿÿÿÿÿ Kÿÿÿÿÿÿ ÿÿÿÿ Lÿÿÿÿÿÿ Nÿÿÿÿÿÿ ÿÿÿÿ Oÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿ $.ÿÿHASH,06174.E4≥"*3:$;'D&)*"    #    ))    *     
  416. 8à à
  417. 3è8:
  418.  
  419.  1Ó2à
  420. /à;à0à  à!     !9 D G J M! P$5RC?
  421. CELL≥eäÿÿÿÿÿ9ÿÿÿ"ÿÿÿÿü
  422. ÿÿÿÿø
  423. ÿÿøÿÿÿÿÿÿÿÿÿÿ    ÿÿü
  424. ÿÿü
  425. ÿÿø
  426. ÿÿø
  427. ÿÿü
  428. ÿÿÿÿü
  429. ÿÿü
  430. ÿÿøÿÿøøÿÿÿÿÿÿÿÿx≥
  431. ÿÿØ$ ÿÿx• ÿÿØ 
  432. ÿÿÿÿÿÿÿÿÿÿ    ÿÿø
  433. ÿÿø ÿÿ ÿÿ
  434. ÿÿÿÿøÿÿÿÿûÿÿøÿÿøÿÿÿÿÿÿÿÿ    ÿÿÿÿøÿÿÿ ÿÿÿ
  435. ÿÿü
  436. ÿÿü ÿÿøÿÿøÿÿø    ÿÿÿÿø ÿÿø
  437. ÿÿ@ÿÿÿÿø
  438. ÿÿÿÿÿÿø ÿÿ(Ó
  439. ÿÿ√s Δ@ÿÿHASHÿ    
  440.       
  441. $ %
  442. 67(xŸx∂Ø1Ø3øøø    ø
  443. ø
  444. )ü ü >     
  445. ! " #&'
  446. ./01
  447. 45;*2*èA…‘Bú=ú
  448. -ú,ú<ú3ú8ú9ú:‡    + Æÿÿ
  449. GRPH≥etÿÿÿÿÿ9ÿÿÿBÿÿÎÿÿ
  450. ÿÿÎÿÿ
  451. ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ|ÿÿHASH
  452.     Ò
  453. Î   "9
  454. l
  455. RULR≥f(ÿÿÿÿÿÿÿÿ‡@ÿÿ[ÿÿ $ÿÿÿ:B ÿÿ $ÿÿ     $ÿÿÿ@ÿÿÿÿÿÿÿJÿÿ$ÿÿHÿÿÿªB<ÿÿiÿ:B ÿÿlÿÿÿbBÿÿΔÿÿ´ÿÿØÿÿüÿÿÿ˚ÿÿÿÿáÿJb•.綯, ç>¯.ʯ.ʯ,–zH¯.ʯ,(–⁄¯.ÊıyÀ¯.Ê Ÿl ìV çπ¯,@ ç>¯.ʯÿÿ ÿÿÿzBÿÿDÿÿ    h!ÿÿÿÿÿbC  V.j.}.Δ.£.¶.Ê.†.›...*.=.P.c.v.….ˇ.ç>¯.ʯÿÿ
  456. ‘ÿÿ °ÿÿÿÿ$ÿÿHÿÿÿÿÿÿaÿJÿÿlÿÿÿbÿôNN.j.}.Δ.£.¶.Ê.†.›...*.=.P.c.v.….ˇ.ç>¯.ʯÿÿΔÿÿiÿªB<ÿÿiÿbBÿÿyÿbBB ÿÿaÿ˚ÿÿiÿzBÿÿéÿbC  V.j.}.Δ.£.¶.Ê.†.›...*.=.P.c.v.….ˇ.ç>¯.ʯÿÿíÿbÿôNN.j.}.Δ.£.¶.Ê.†.›...*.=.P.c.v.….ˇ.ç>¯.ʯÿÿÿbBB ÿÿ´ÿÿØÿÿüÿÿ ÿÿDÿÿ    hÿÿÿÿ$ÿÿHÿÿlÿÿΔÿÿ´N5ÿÿHASHÿ~œçî>
  457. &W>%ÿ3,40Q5v6˝7À80    ˛
  458. ‡
  459. (, Q v˝Àå
  460. /TyıÃ,Q v"˝$À-å.    
  461. /    /0    T1    y2
  462. 0  fi∞# Ÿfi∞+ œC,
  463. C'⁄ä˜*≤')@ÿ@‡ È√LKUP    &
  464. '()*´+,-./01œ234567 89: ;<=>?
  465. @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~•™≠¨”§©ª«¬–®°¯±“≈…—Ÿµ∂Δ‚„ˆ˘˙˛ !ı"ƒ¢#$£ÿÿ%∞≥∑∫Ω√≈…—‘Ÿ⁄∂ΔŒ‚„‰ˆ˜˘˙˚˝˛ˇıƒ ¡¢£€¥‰ÿÿ$NAMEDefault
  466. Default SSHeaderBodyFooterFootnoteFootnote Index
  467. HeadingH2.H2 Code.CV
  468. Heading1.H1Italic HeadingH3.H3Bullet    ChecklistNumberClassic% Blue Gray 16 Blue Gray 2GColorfulU
  469. 3D Table 1d
  470. 3D Table 2p
  471. AccountingªHarvard·LegalÂDiamond    \#DFNTM    HelveticaGenevaPalatinoGenevaGenevaGenevaGenevaGeneva GenevaGenevaGeneva Geneva
  472. GenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGenevaGeneva GenevaGeneva!GenevaÿÿGeneva:H
  473. Letter GothicETBL@FNTMDCUTSD"DSUMD*HDNIDcSTYLDmETBL[ÿfl‡üûúùø›ñòóôõö÷